//
//  YYYHomeStatusViewModel.swift
//  HotNews
//
//  Created by YYY on 2017/10/25.
//  Copyright © 2017年 成品家（北京）网路科技有限公司. All rights reserved.
//
/*
 SDWebImageManager.shared().imageDownloader
 下载图像
 downloadImage是SDWebImage的核心方法
 图像下载完成之后，会自动保存在沙盒中，文件路径是URL的md5
 如果沙盒中已经存在缓存的图像，后续加载图像，直接加载本地沙盒的图像
 不会发起网络请求，回调方法同样会调用
 方法是同样的方法，调用是同样的调用，不过内部不会再次发起网络请求
 */

import UIKit
import SDWebImage

private let max_pullUpTimes = 3

class YYYHomeStatusViewModel: NSObject {
    //数组保存model对象数据
    lazy var statusListArray = [YYYHomeViewModel]()
    private var pullUpErrorTimes = 0
    
    //根据isPullUp判断是上拉加载还是下拉刷新
    func loadStatusListData(isPullUp: Bool = false,completion: @escaping (_ shouldRefresh: Bool)->())
    {
        if isPullUp && pullUpErrorTimes > max_pullUpTimes
        {
            completion(false)
            return
        }
        
        let sinceID = isPullUp ? 0 : (statusListArray.first?.homeModel.id ?? 0)
        var max_id = isPullUp ? (statusListArray.last?.homeModel.id ?? 0) : 0
        max_id = (max_id > 0) ? (max_id - 1) : max_id
        
        
        //通过数据访问层加载数据
        
        YYYHomeListDAL.loadStatus(since_id: sinceID, max_id: max_id) { (listArray, isOK) in
//        }
//        YYYNetworkManager.shared.statusList(since_id: sinceID, max_id: max_id) { (listArray, isOK) in
            //如果网络请求失败，直接返回回调
            if !isOK
            {
                completion(false)
                return
            }
            //视图模型
            var array = [YYYHomeViewModel]()
            for dict in listArray ?? []
            {
                //创建首页模型
                let model = YYYHomeStatusModel()
                //使用字典设置模型数值
                model.yy_modelSet(with: dict)
                //使用模型创建视图模型
                let viewModel = YYYHomeViewModel(model: model)
                array.append(viewModel)
            }
            //视图模型创建完成 array
            
            if isPullUp
            {
                //加载更多
                self.statusListArray += array
            }
            else
            {
                //刷新数据
                self.statusListArray = array + self.statusListArray
            }
            print(array)
            if array.count==0 && isPullUp
            {
                self.pullUpErrorTimes += 1
                completion(false)
            }
            else
            {
                //真正完成数据的回调
                //缓存单张图像，缓存完成，计算配图大小后进行回调
                self.cacheSingleImage(viewModelArray: array, completion: completion)
            }
        }
    }
}

extension YYYHomeStatusViewModel
{
    //缓存单张图像
    private func cacheSingleImage(viewModelArray: [YYYHomeViewModel], completion: @escaping (_ shouldRefresh: Bool)->())
    {
        //创建调度组
        let group = DispatchGroup()
        //图片大小
        var length = 0
        for viewModel in viewModelArray
        {
            if viewModel.picUrls?.count != 1
            {
                continue
            }
            //只有一张图像
            guard let urlString = viewModel.picUrls?.first?.thumbnail_pic,
                  let url = URL(string: urlString) else
            {
                continue
            }
            //入组
            group.enter()
            SDWebImageManager.shared().imageDownloader?.downloadImage(with: url, options: [], progress: nil, completed: { (image, _, _, _) in
                
                //将图像转换成二进制数据
                if let image = image, let data = UIImagePNGRepresentation(image)
                {
                    length += data.count
                    
                    //更新单张图像的大小
                    viewModel.updateSingleImageSize(image: image)
                }
                print("图像的大小：\(length)")
                
                //出组
                group.leave()
            })
        }
        //监听调度任务
        group.notify(queue: DispatchQueue.main) {
            print("要缓存的图像长度：\(length/1024)k")
            completion(true)
        }
    }
}

